
#ifndef EDGE_H_
#define EDGE_H_

#include <string>
#include "weight.hpp"

class Node;

enum RoadType{
	CALLE = 1,
	AVENIDA = 2,
	AUTOPISTA = 3
};

enum RoadSide{
	PAR = 1,
	IMPAR = 2,
	AMBOS = 3
};

/**
 * Class Edge: representa las aristas del grafo
 */
class Edge {
private:
		std::string id;
		std::string roadName;

		RoadSide	roadSide;			//par, impar, ambos 

        RoadType	roadType;			//calle, avenida, autopista
        int			initialHeight;      //altura inicial
        int			finalHeight;        //altura final
		std::string originId;
		std::string destinyId;
		Weight 		weight;

		bool		belongToMP;
        int			initialMPHeight;      //altura inicial camino minimo
        int			finalMPHeight;        //altura final camino minimo

public:

	/**
	 * Constructor por defecto de la clase Edge.
	 */
    Edge(){}

	/**
     * Constructor parametrizado de la clase Edge.
     */
	Edge(std::string id, std::string originId, std::string destinyId, Weight weight);

    /**
     * Constructor parametrizado de la clase Edge.
     */
	Edge(std::string id, std::string originId, std::string destinyId, Weight weight, int initialHeight, int finalHeight, std::string roadName, RoadType roadType);

	/**
	 * Metodo getter del id de la arista.
	 * @return Retorna el id de la arista.
	 */
	std::string getId();

	/**
	 * Metodo getter del id del nodo origen de la arista.
	 * @return Retorna el id del nodo origen de la arista.
	 */
	std::string getOriginId();

	/**
	 * Metodo getter del id del nodo destino de la arista.
	 * @return Retorna el id del nodo destino de la arista.
	 */
	std::string getDestinyId();
    
    /**
	 * Metodo getter del tipo de camino (avenida, calle, autopista).
	 * @return Retorna el tipo de camino.
	 */
    RoadType getRoadType();


    /**
	 * Metodo getter del lado de camino (par, impar, lado).
	 * @return Retorna el tipo de camino.
	 */
    RoadSide getRoadSide();

	
	/**
	 * Metodo getter del nombre del camino.
	 * @return Retorna el nombre del camino.
	 */
    std::string getRoadName();

    /**
	 * Metodo getter de la altura inicial de la arista.
	 * @return Retorna la altura inicial de la arista.
	 */
    int getInitialHeight();

    /**
	 * Metodo getter de la altura final de la arista.
	 * @return Retorna la altura final de la arista.
	 */
    int getFinalHeight();

	/**
	 * Metodo getter del atributo de clase Weight de la arista.
	 * @return Retorna el atributo weight de la arista.
	 */
	Weight getWeight();

	/**
	 * Metodo setter del id de la arista.
	 */
	void setId(std::string id);

	/**
	 * Metodo setter del id del nodo origen de la arista.
	 */
	void setOrigin(std::string origin);

	/**
	 * Metodo setter del id del nodo origen de la arista.
	 */
	void setDestiny(std::string destiny);
    
    /**
	 * Metodo setter del tipo de camino.
	 */
    void setRoadType(RoadType roadType);   

    /**
	 * Metodo setter del lado de camino.
	 */
    void setRoadSide(RoadSide roadSide);   

	
	/**
	 * Metodo setter del nombre del camino.
	 */
    void setRoadName(std::string roadName);

    /**
	 * Metodo setter de la altura inicial de la arista.
	 */
    void setInitialHeight(int initialHeight);

    /**
	 * Metodo setter de la altura final de la arista.
	 */
    void setFinalHeight(int finalHeight);        

	/**
	 * Metodo setter del id del nodo destino de la arista.
	 */
	void setWeight(Weight weight);

	/**
	 * Operador asignacion.
	 */
	Edge &operator=(Edge &original);

	/**
	 * Operador comparacion.
	 */
    int operator==(Edge &original)const;

	/**
	 * Operador comparacion por diferencia.
	 */
    int operator!=(Edge &original) const;

	/**
	 * Operador menor.
	 */
    int operator<(Edge &original)const;

	/**
	 * Operador mayor.
	 */
    int operator>(Edge &original) const;

	/**
	 * Operador menor-igual.
	 */
    int operator<=(Edge &original) const;

	/**
	 * Operador mayor-igual.
	 */
    int operator>=(Edge &original) const;

    /**
     * Destructor de la clase Edge.
     */
	virtual ~Edge();


	//Devuelve si pertenece al camino minimo
	bool getBelongToMP();


	//Setea que todo el edge pertenece al camino
	void setBelongToMP();

	//Setea las alturas iniciales y finales del MP
	void setBelongToMP(int initialMPHeight , int finalMPHeight);

	//Borrar todo lo refente a la busqueda del MP y a su seteo
	void cleanMPInfo();
	
	int getInitialMPHeight();

	int getFinalMPHeight();

};

#endif 
